<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>

<body>
  <script>
    /*
    什么是面向对象：
      面向对象是一种编程思想，JS本身就是基于面向对象构建出来的（例如：JS中有很多内置类，像Promise就是ES6中新增的一个内置类，我们可以基于new Promise来创建一个实例，来管理异步编程，我在项目中，Promise也经常用，自己也研究过它的源码...），我之前看过一点框架源码，我们平时用的VUE/REACT/JQUERY也是基于面向对象构建出来的，他们都是类，平时开发的时候都是创建他们的实例来操作的；当然我自己在真实项目中也封装过一些组件插件（例如：DIALOG、拖拽），也是基于面向对象开发的，这样可以创造不同的实例来管理私有的属性和公有的方法，很方便。。。
      JS中的面向对象，和其它编程语言还是有略微不同的，JS中类和实例是基于原型和原型链机制来处理的，而且JS中关于类的重载、重写、继承也和其它语言不太一样（其它语言：重载是多个方法，方法名相同，参数不一样，来实现重载。JS中：同一个方法，根据传参不一样，来实现不同的特性）。。。

      封装：低耦合高内聚
      多态：重载和重写
            重载：方法名相同，形参个数或者类型不一样
            （JS中不存在真正意义上的重载，
              JS中重载指的是同一个方法，根据传参不同，实现出不同的效果）
            重写：在类的继承中，子类可以重写父类中的方法
            继承：子类继承父类中的属性和方法
     */
    // java后台的重载
    // public void sum(int m, int n) {}
    // public void sum(int m, int n, float x) {}
    // public void sum(int m, String n) {}
    // sum(10, 20)
    // sum(10, 20, 30.9)
    // sum(10, "AA")
    // sum()
    // 根据传递参数的不同，去调用上面对应的方法

    // 为什么会这样处理呢？
    // 因为考虑到方法的承压能力，服务器只有一台，每个人作为客户端都向它发起请求，请求同样的方法，这个方法同时接受的并发数就很高，所以后台就会利用重载把一个非常复杂的方法根据传参的不同，重载成各个不同的方法，但是方法名都叫一个
    // 如果都写在一个里面，这样会增加方法的复杂度和请求并发数

    // 但是前端就不能这么干了
    function sum(m, n) {
      console.log(1);
    }
    function sum(m, n, x) {
      console.log(2);
    }
    sum(1, 2)
    sum(1, 2, 3)
    // 所以JS中不存在真正意义上的重载
    // 但是以下可以认为是JS中的重载
    function sum(x, y, z) {
      // 上面的参数可以是：...args或者使用arguments来接受多个参数
      if (typeof z === "undefined") {
        // ...
        return
      }
      // ...
    }
    // 前端不需要像后台那样考虑太多并发这个问题，所以前端中并没有这么去构建，而是同一个方法，根据传参不一样来实现不同的效果
    // 客户端只有你自己在用，不需要考虑并发

  </script>
</body>

</html>